﻿using System;
using Csla;
using Ent.AccesoDatos;
using System.Collections.Generic;

namespace Ent.Inscripcion.Core.Core
{
    [Serializable]
    public class RegistroTutoria : BusinessBase<RegistroTutoria>
    {
        #region Business Methods

        private static PropertyInfo<Guid> IdProperty = RegisterProperty<Guid>(o => o.Id, "Name");
        public Guid Id
        {
            get { return GetProperty(IdProperty); }
            set { SetProperty(IdProperty, value); }
        }

        private static PropertyInfo<string> EstudianteIdProperty = RegisterProperty<string>(o => o.EstudianteId, "Name");
        public string EstudianteId
        {
            get { return GetProperty(EstudianteIdProperty); }
            set { SetProperty(EstudianteIdProperty, value); }
        }

        private static PropertyInfo<string> HorarioIdProperty = RegisterProperty<string>(o => o.HorarioId, "Name");
        public string HorarioId
        {
            get { return GetProperty(HorarioIdProperty); }
            set { SetProperty(HorarioIdProperty, value); }
        }

       
        private static PropertyInfo<string> NivelIdProperty = RegisterProperty<string>(o => o.NivelId, "Name");
        public string NivelId
        {
            get { return GetProperty(NivelIdProperty); }
            set { SetProperty(NivelIdProperty, value); }
        }

        private static PropertyInfo<DateTime> FechaProperty = RegisterProperty<DateTime>(o => o.Fecha, "Name");
        public DateTime Fecha
        {
            get { return GetProperty(FechaProperty); }
            set { SetProperty(FechaProperty, value); }
        }

        
        private static PropertyInfo<string> EstadoProperty = RegisterProperty<string>(o => o.Estado, "Name");
        public string Estado
        {
            get { return GetProperty(EstadoProperty); }
            set { SetProperty(EstadoProperty, value); }
        }

        private static PropertyInfo<int> NumeroCambiosProperty = RegisterProperty<int>(o => o.NumeroCambios, "Name");
        public int NumeroCambios
        {
            get { return GetProperty(NumeroCambiosProperty); }
            set { SetProperty(NumeroCambiosProperty, value); }
        }

        private static PropertyInfo<string> NumeroFacturaProperty = RegisterProperty<string>(o => o.NumeroFactura, "Name");
        public string NumeroFactura
        {
            get { return GetProperty(NumeroFacturaProperty); }
            set { SetProperty(NumeroFacturaProperty, value); }
        }

        private static PropertyInfo<string> ItemProperty = RegisterProperty<string>(o => o.Item, "Item");
        public string Item
        {
            get { return GetProperty(ItemProperty); }
            set { SetProperty(ItemProperty, value); }
        }

        private static PropertyInfo<string> FechaPagoProperty = RegisterProperty<string>(o => o.FechaPago, "FechaPago");
        public string FechaPago
        {
            get { return GetProperty(FechaPagoProperty); }
            set { SetProperty(FechaPagoProperty, value); }
        }

        private static PropertyInfo<string> IdentificacionProperty = RegisterProperty<string>(o => o.Identificacion, "Identificacion");
        public string Identificacion
        {
            get { return GetProperty(IdentificacionProperty); }
            set { SetProperty(IdentificacionProperty, value); }
        }
        #endregion

        #region Validation Rules

        protected override void AddBusinessRules()
        {
            // TODO: add validation rules
            //ValidationRules.AddRule(RuleMethod, "");
        }

        #endregion

        #region Factory Methods

        public static RegistroTutoria NewRegistroTutoria()
        {
            return DataPortal.Create<RegistroTutoria>();
        }

        public static RegistroTutoria GetRegistroTutoria(Guid id)
        {
            return DataPortal.Fetch<RegistroTutoria>(id);
        }

        public static void DeleteRegistroTutoria(Guid id)
        {
            DataPortal.Delete<RegistroTutoria>(id);
        }

        private RegistroTutoria()
        { LoadProperty(IdProperty, Guid.NewGuid()); }

        #endregion

        #region Data Access

        [RunLocal]
        protected override void DataPortal_Create()
        {
            // TODO: load default values
            // omit this override if you have no defaults to set
            base.DataPortal_Create();
        }

        private void DataPortal_Fetch(Guid criteria)
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            var parametros = new List<Parametro> {new Parametro("Id", criteria)};
            var datos = accesoDatos.EjecutarReader("ConsultarInscripcion", parametros);
            if (datos.Datos.Read())
            {
                LoadProperty(IdProperty, Guid.Parse(datos.Datos.GetString(0)));
                LoadProperty(EstudianteIdProperty, datos.Datos.GetString(1));
                LoadProperty(HorarioIdProperty, datos.Datos.GetString(2));
                LoadProperty(NivelIdProperty, datos.Datos.GetString(3));
                LoadProperty(FechaProperty, DateTime.Parse(datos.Datos.GetString(4)));
                LoadProperty(EstadoProperty, datos.Datos.GetString(5));
                LoadProperty(NumeroFacturaProperty, datos.Datos.GetString(6));
                LoadProperty(NumeroCambiosProperty, datos.Datos.GetInt32(7));
            }
            if (!datos.Datos.IsClosed) datos.Datos.Close();
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_Insert()
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            var parametros = new List<Parametro>
                                 {
                                     new Parametro("Fecha", ReadProperty(FechaProperty)),
                                     new Parametro("Nivel", ReadProperty(NivelIdProperty)),
                                     new Parametro("Estudiante", ReadProperty(EstudianteIdProperty)),
                                     new Parametro("Estado", ReadProperty(EstadoProperty)),
                                     new Parametro("Horario", ReadProperty(HorarioIdProperty)),
                                     new Parametro("Id", ReadProperty(IdProperty)),
                                     new Parametro("Factura", ReadProperty(NumeroFacturaProperty)),
                                     new Parametro("FechaFactura", ReadProperty(FechaPagoProperty)),
                                     new Parametro("ItemDerecho", ReadProperty(ItemProperty)),
                                     new Parametro("Identificacion", ReadProperty(IdentificacionProperty))
                                 };
            accesoDatos.EjecutarQuery("InsertarInscripcion", parametros);
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_Update()
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            var parametros = new List<Parametro>
                                 {
                                     new Parametro("Nivel", ReadProperty(NivelIdProperty)),
                                     new Parametro("Horario", ReadProperty(HorarioIdProperty)),
                                     new Parametro("Id", ReadProperty(IdProperty))
                                 };
            accesoDatos.EjecutarQuery("ActualizarInscripcion", parametros);
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_DeleteSelf()
        {
            DataPortal_Delete(ReadProperty(IdProperty));
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        private void DataPortal_Delete(Guid criteria)
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.Mysql);
            var parametros = new List<Parametro> {new Parametro("Id", ReadProperty(IdProperty))};
            accesoDatos.EjecutarQuery("EliminarInscripcion", parametros);
        }

        #endregion
    }
}
